package com.zhhtech.zhh.ui.activity.main

import android.content.Intent
import android.os.Bundle
import android.view.Gravity
import android.view.View
import androidx.activity.viewModels
import androidx.fragment.app.Fragment
import com.flyco.tablayout.listener.OnTabSelectListener
import com.lzf.easyfloat.EasyFloat
import com.lzf.easyfloat.anim.DefaultAnimator
import com.lzf.easyfloat.enums.ShowPattern
import com.lzf.easyfloat.enums.SidePattern
import com.zhhtech.zhh.R
import com.zhhtech.zhh.common.UserCache
import com.zhhtech.zhh.databinding.ActivityMainBinding
import com.zhhtech.zhh.ui.activity.commom.LoginActivity
import com.zhhtech.zhh.ui.base.BaseActivity
import com.zhhtech.zhh.ui.ext.tabData
import com.zhhtech.zhh.ui.ext.toastMessageLong
import com.zhhtech.zhh.ui.fragment.FuZhaiFragment
import com.zhhtech.zhh.ui.fragment.HomeFragment
import com.zhhtech.zhh.ui.fragment.MineFragment
import com.zhhtech.zhh.ui.fragment.MyConsultationFragment
import com.zhhtech.zhh.ui.helper.AppUpdateHelper.initUpdate
import com.zhhtech.zhh.ui.helper.jumpWx
import com.zhhtech.zhh.ui.utils.ActivityManger
import com.zhhtech.zhh.ui.utils.FragmentChangeManager
import com.zhhtech.zhh.ui.utils.Utils
import com.zhhtech.zhh.ui.viewmodel.MainViewModel

class MainActivity : BaseActivity<ActivityMainBinding>(), OnTabSelectListener {
    private val vm: MainViewModel by viewModels()
    private var mFragmentChangeManager: FragmentChangeManager? = null
    private var lastPosition: Int = 0
    override fun initView() {
        Utils.invasionStatusBar(this)
        Utils.setDefaultStatusBarFont(this, true)
        vb.tabLayout.setOnTabSelectListener(this)
        vb.tabLayout.tabData {
            tab("主页", R.mipmap.nor01, R.mipmap.pre01)
//            tab("", -1, -1)
            tab("方案", R.mipmap.nor02, R.mipmap.pre02)
//            tab("负债", R.mipmap.nor03, R.mipmap.pre03)
            tab("我的", R.mipmap.nor04, R.mipmap.pre04)
        }
        val fragments = ArrayList<Fragment>()
        fragments.add(HomeFragment())
        fragments.add(MyConsultationFragment().apply {
            arguments = Bundle().apply {
                putBoolean("home", true)
            }
        })
//        fragments.add(FuZhaiFragment())
//        fragments.add(CaseProgressFragment())
//        fragments.add(ShareFragment())
        fragments.add(MineFragment())
        mFragmentChangeManager = FragmentChangeManager(supportFragmentManager, R.id.frameLayout, fragments)

        ActivityManger.finishAllActivity(MainActivity::class.java)
        initUpdate()
//        val manufacturer = Build.MANUFACTURER
//        val model = Build.MODEL
//        val version = Build.VERSION.INCREMENTAL
//        val text = "是否鸿蒙：${HarmonyUtils.isHarmonyOs()} \n 鸿蒙版本：${HarmonyUtils.getHarmonyVersion()} \n $manufacturer \n $model \n $version"
//        showAlertDialog {
//            message(text)
//            negativeButton {  }
//            positiveButton ("复制"){
//                text.clipboard()
//            }
//        }

        EasyFloat.with(this)
            // 设置浮窗xml布局文件/自定义View，并可设置详细信息
            .setLayout(R.layout.layout_float_customer_service) {
                it.findViewById<View>(R.id.ll_float)?.apply {
                    setOnClickListener {
                        jumpWx(vm.mConfig.value)
                    }
                }
            }
            // 设置浮窗显示类型，默认只在当前Activity显示，可选一直显示、仅前台显示
            .setShowPattern(ShowPattern.CURRENT_ACTIVITY)
            // 设置吸附方式，共15种模式，详情参考SidePattern
            .setSidePattern(SidePattern.RESULT_HORIZONTAL)
            // 设置浮窗的标签，用于区分多个浮窗
            .setTag("MainActivity")
            // 设置浮窗是否可拖拽
            .setDragEnable(true)
            // 浮窗是否包含EditText，默认不包含
            .hasEditText(false)
            // 设置浮窗固定坐标，ps：设置固定坐标，Gravity属性和offset属性将无效
//            .setLocation(100, 200)
            // 设置浮窗的对齐方式和坐标偏移量
            .setGravity(Gravity.END or Gravity.CENTER_VERTICAL, 0, 200)
            // 设置当布局大小变化后，整体view的位置对齐方式
            .setLayoutChangedGravity(Gravity.END)
            // 设置拖拽边界值
//            .setBorder(100, 100, 800, 800)
            // 设置宽高是否充满父布局，直接在xml设置match_parent属性无效
            .setMatchParent(widthMatch = false, heightMatch = false)
            // 设置浮窗的出入动画，可自定义，实现相应接口即可（策略模式），无需动画直接设置为null
            .setAnimator(DefaultAnimator())
            // 设置系统浮窗的不需要显示的页面
//            .setFilter(MainActivity::class.java, SecondActivity::class.java)
            // 设置系统浮窗的有效显示高度（不包含虚拟导航栏的高度），基本用不到，除非有虚拟导航栏适配问题
//            .setDisplayHeight { DisplayUtils.rejectedNavHeight(it) }
            // 浮窗的一些状态回调，如：创建结果、显示、隐藏、销毁、touchEvent、拖拽过程、拖拽结束。
            // ps：通过Kotlin DSL实现的回调，可以按需复写方法，用到哪个写哪个
//            .registerCallback {
//                createResult { isCreated, msg, view -> }
//                show { }
//                hide { }
//                dismiss { }
//                touchEvent { view, motionEvent -> }
//                drag { view, motionEvent -> }
//                dragEnd { }
//            }
            // 创建浮窗（这是关键哦😂）
            .show()
    }

    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        ActivityManger.finishAllActivity(MainActivity::class.java)
        val position = intent?.getIntExtra("position", -1) ?: -1
        if (position >= 0) {
            vb.tabLayout.currentTab = position
            onTabSelect(position)
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        EasyFloat.dismiss("MainActivity", true)
    }

    override fun onTabSelect(position: Int) {
        if (position > 0) {
            if (!UserCache.isLogin) {
                launchStartActivityForResult(LoginActivity::class.java) {
                    vb.tabLayout.currentTab = position
                    switchPosition(position)
                }
                "请先登录...".toastMessageLong()
                vb.tabLayout.currentTab = lastPosition
                return
            }
        }
        mFragmentChangeManager?.setFragments(position)
    }

    override fun onTabReselect(position: Int) {
    }

    private fun switchPosition(position: Int) {
        lastPosition = position
        mFragmentChangeManager?.setFragments(position)
    }
}